//
//  HOPStatus.swift
//  WB01
//
//  Created by HOP on 15/12/20.
//  Copyright © 2015年 HOP. All rights reserved.
//

import UIKit

import SDWebImage

class HOPStatus: NSObject {
/// 1.定义模型属性
    // MARK: - 属性
    /// 被转发微博模型,只有转发的微博模型才有,原创的微博模型是没有的
    var retweeted_status: HOPStatus?
    /// 创建时间
    var created_at: String?
    /// 微博id
    var id: Int = 0
    /// 微博正文内容
    var text: String?
    /// 来源
    var source: String?
    /// 缓存行高, rowHeight == nil 说明没有缓存过行高
    var rowHeight: CGFloat?
     /// 返回cell的缓存标识,根据不同模型返回不同的缓存标识
    func cellID() -> String {
        // 判断是原创的模型,还是转发的模型.根据retweeted_status来判断
        // 如果retweeted_status有值,是一个转发微博
        // 如果retweeted_status没有值,是一个原创微博
        return retweeted_status == nil ? HOPStatusCellReuseIdentifier.StatusNormalCell.rawValue : HOPStatusCellReuseIdentifier.StatusForwardCell.rawValue
       }
    
    
    
    /// 微博的配图 [String: AnyObject]
    var pic_urls: [[String: AnyObject]]? {
        didSet {
        let count = pic_urls?.count ?? 0
            if count == 0 {
            return
            }
            // 有图片.
            // 创建数组保存转到的NSURL
            storePictureURLs = [NSURL]()
            // 创建大图图片的NSURL数组
            largeStorePictureURLS = [NSURL]()
            for dict in pic_urls! {
            let urlStirng = dict["thumbnail_pic"] as! String
            let url = NSURL(string: urlStirng)
            storePictureURLs?.append(url!)
                // 大图的url,将小图的urlString替换thumbnail为large
                let largeURLString = urlStirng.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                let largeURL = NSURL(string: largeURLString)!
                largeStorePictureURLS?.append(largeURL)
            }
         }
     }
    /// 微博大图配图的NSURL数组
    var largeStorePictureURLS: [NSURL]?
    // 如果是原创微博显示原创微博的大图图片,如果是转发微博显示被转发微博的大图图片
    var largePictureURLs: [NSURL]? {
        return retweeted_status == nil ? largeStorePictureURLS: retweeted_status?.largeStorePictureURLS
    }

    /// 微博配图的NSURL数组.
    var storePictureURLs: [NSURL]?
    /// 如果是原创微博显示原创微博的图片,如果是转发微博显示转发微博的图片
    var pictureURLs: [NSURL]? {
        // 如果是原创微博显示原创微博的图片: storePictureURLs
        // 如果是转发微博显示转发微博的图片: retweeted_status?.storePictureURLs
        return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
     }
    
    /// 转发数
    var reposts_count: Int = 0
    /// 评论数
    var comments_count: Int = 0
     /// 表态数(赞)
    var attitudes_count: Int = 0
    /// 用户模型
    var user: HOPUser?
    // 2.字典转模型
    init(dict: [String: AnyObject]) {
        // 在init之前能赋值,就可以不加?
        super.init()
        // 使用KVC来赋值所有属性, KVC是一个方法,方法是只有对象初始化完毕之后才能调用
        setValuesForKeysWithDictionary(dict)
    }
    // 3.字典的key在模型中找不到对应的属性,需要实现 forUndefinedKey
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    // setValuesForKeysWithDictionary传入的key有多少个就会调用用多少次,并且传入相应的key和value
    override func setValue(value: AnyObject?, forKey key: String) {
        // 判断如果是user这个key,我们自己来字典转模型,不需要kvc
        if key == "user" {
        // 我们自己来字典转模型
        if let dict = value as? [String: AnyObject] {
        let userModel = HOPUser(dict: dict)
        // 将模型赋值赋值给user属性
        self.user = userModel
        
        }
             // 一定要记得return,不然会调用父类的setValue,会被覆盖
            return
        }
        if key == "retweeted_status" {
        // 我们自己字典转模型
            if let dict = value as? [String: AnyObject] {
            retweeted_status = HOPStatus(dict: dict)
//            print("碰到被转发微博: \(retweeted_status)")
            }
            // 一定要记得return,不要被父类的给覆盖了
        return
        }
        super.setValue(value, forKey: key)
    }
    // 4.实现description属性
    var descripation: String {
    let prop = ["created_at", "id", "text", "source", "pic_urls", "reposts_count", "comments_count", "attitudes_count", "user","retweeted_status"]
    // 通过一个数组来生成一个字典,数组中的元素,会成为字典的key,key所对应的value，会从模型中来找对应的属性值
    
    let dict = dictionaryWithValuesForKeys(prop)
        // \n 换行, \t table键
        return "\n\t微博模型: \(dict)"
      }
    // MARK: - 加载微博数据
class func mLoadStatus(since_id: Int, max_id: Int,finished: (statuses: [HOPStatus]?,error: NSError?) -> ()) {
        // 3.直接调用网络工具类的方法来加载微博数据
        // 4.准备闭包
        HOPNetworkTools.sharedInstance.loadStatus (since_id, max_id: max_id){ (result, error) -> () in
            // 6.1.判断是否有数据
            if error != nil || result == nil {
            finished(statuses: nil, error: error)
                return
            }
            // 没有错误,有数据
            // 6.2 字典转模型,判断字典是否有statuses,将statuses的值转成数组,数组里面存放的是字典
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                // 能获取到微博数据
                
                // 6.3 创建一个数组,来存放转好的模型
            var statuses = [HOPStatus]()
                // 6.4 遍历数组
                // [String: AnyObject] == Dictionary<String, AnyObject>
                for dict in array {
                let status = HOPStatus(dict: dict)
                statuses.append(status)
                
                }
                // 6.7 下载图片
                chachWebImage(statuses, finished: finished)
                // 6.7 所有的模型都转换完成,告诉调用的人有微博模型数据了
                finished(statuses: statuses, error: nil)
            }else {
                finished(statuses: nil, error: nil)
             }
            
            
        }
    }
    //缓存图片
    class func chachWebImage(statuses: [HOPStatus],finished: (statuses: [HOPStatus]?,error: NSError?) -> ()) {
        // 记录下载图片的大小
    var length = 0.0
    // 定义任务组
        let group = dispatch_group_create()
    // 遍历模型数组
        for status in statuses {
            guard let urls = status.pictureURLs else {
                continue
            }
            if urls.count == 1 {
                //  6. SDWebImageManager缓存图片.是一个异步的任务
                // 6.1 在异步任务之前进入组
            let url = urls[0]
            dispatch_group_enter(group)
            // 6.2 执行异步下载图片
               SDWebImageManager.sharedManager().downloadImageWithURL(url
                , options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    dispatch_group_leave(group)
                    if error != nil {
                    print("缓存图片失败: \(url)")
                    return
                    }
                    let data = UIImagePNGRepresentation(image)!
                    length += Double(data.length)
                 })
            
            }
            
         }
    // 7. 在所有的异步任务完成后再来执行
    dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
        print("所有图片下载完成, 大小:\(length / 1024 / 1024) M")
        finished(statuses: statuses, error: nil)
        }
    }
 }
